Настраиваем память JVM-приложения в Kubernetes

Друзья, всем привет! Как известно, в Kubernetes у каждого pod’а есть ограничение на  использование памяти (limits.memory), и, как показывает опыт, далеко не всегда очевидно, как JVM-приложение интерпретирует эту настройку, что порой может приводить к OOMKill.

Я хотел бы поделиться одним из способов настройки памяти для Java-приложений в Kubernetes. Сразу скажу, что итоговые настройки, к которым мы придём, будут приведены лишь в качестве примера и должны настраиваться индивидуально под каждое приложение. Рассматривать будем настройки и метрики обычного микросервиса на Spring boot, интегрированного со Spring Boot Admin (далее просто SBA).

Для начала немного освежим теорию по устройству памяти в Java. Вкратце, глобально память делится на два раздела, упрощенно:

  • Heap. Этот раздел делится на подразделы:

    • Eden — для вновь созданных объектов, чистится при каждой сборке мусора (Minor GC).

    • Survivor — для объектов, переживших Minor GC.

    • Tenured — для долгоживущих объектов, чистится при Major GC.

  • Non-hea

Читать далее